\documentclass[a4paper]{article}
\usepackage[a4paper,margin=2cm,top=2.0cm,bottom=2.34cm]{geometry}
\usepackage[spanish,activeacute]{babel}
%\usepackage[T1]{fontenc}
\usepackage{color}
\usepackage{algo2symb}
\usepackage{newalgo}
\usepackage{tad}
%\usepackage{itef}

\parskip=1.5ex
\pagestyle{empty}

\newcommand\interfaz[5]{\noindent \\#1\ifblank{#2}\then{}\else{(#2)}\fi \ifblank{#3}\then{}\else{$\rightarrow$ #3}\fi \\ \{#4\} \\ \{#5\} \\}
\newcommand\estr[2]{\noindent #1 se representa con estr\_#1 donde estr\_#1 es:\\ #2}
\newcommand\rep[2]{\noindent ($\forall$ e:estr\_#1) Rep: estr\_#1 $\rightarrow$ bool\\ Rep(e) = #2}
\newcommand\abs[3]{\noindent ($\forall$ e:estr\_#1) Abs: estr\_ #1 e $\rightarrow$ #1 \hspace{3em}(Rep(e))\\ Abs(e) = #2 / \\ #3}
\newcommand\complejidad[1]{\noindent \comentario{Complejidad: \Ode{#1}}}

\begin{document}
\noindent \textbf{M'odulo Arreglo Redimensionable}\\
{Se explica con la especificacion de arreglo\_redimensionable($\alpha$)}

\noindent \textbf{Interfaz}

\complejidad{1}
\interfaz{CrearArreglo}{$\param{in}{n}${nat}}{res\!: arreglo\_redimensionable$(\alpha$)}{true}{res \igobs crearArreglo(n)}

\complejidad{1}
\interfaz{Agregar}{$\param{in}{b}${$\alpha$}, $\param{in}{n}${nat}, $\param{inout}{a}${arreglo\_redimensionable($\alpha$)}}{}{a \igobs ${a}_{0}$ $\wedge$ n $<$ tam(a)}{a \igobs ${a}_{0}[n]$ = b}

\complejidad{1}
\interfaz{Definido?}{$\param{in}{n}${nat}, $\param{in}{a}${arreglo\_redimensionable($\alpha$)}}{res\!: bool}{true}{res \igobs definido?(a,n)}

\complejidad{1}
\interfaz{Iesimo}{$\param{in}{n}${nat}, $\param{in}{a}${arreglo\_redimensionable($\alpha$)}}{res\!: $\alpha$}{definido?(a,n)}{res \igobs a[n]}

\complejidad{n}
\interfaz{Extender}{$\param{inout}{a}${arreglo\_redimensionable($\alpha$)}}{}{a \igobs ${a}_{0}$}{a \igobs extender(${a}_{0}$)}

\noindent \textbf{Estructura}

\estr{arreglo\_redimensionable($\alpha$)}{arreglo($\alpha$)}

\noindent \textbf{Invariante de representaci'on}

\rep{arreglo\_redimensionable}{True}\\

\noindent \textbf{Funci'on de abstracci'on}

\abs{arreglo\_redimensionable}{a:arreglo\_redimensionable}{tam(a) $\igobs$ tam(e) $\wedge$  ($\forall$ n:nat, definido?(a,n)) definido?(e) $\yluego$ a[n] $\igobs$ e[n]}\\

\noindent \textbf{Algoritmos}\\

\begin{algorithm}{iCrearArreglo}{\param{in}{n}{nat}}{res\!: estr\_arreglo\_redimensionable}
	res \= icrearArreglo(n)
\end{algorithm}

\begin{algorithm}{iAgregar}{\param{in}{b}{\alpha},\param{in}{n}{nat},\param{inout}{a}{estr\_arreglo\_redimensionable}}{}
	a[n]\=b
\end{algorithm}

\begin{algorithm}{iDefinido?}{\param{in}{a}{estr\_arreglo\_redimensionable},\param{in}{n}{nat}}{res\!: bool }
	res \= iDefinido?(a,n)
\end{algorithm}

\begin{algorithm}{iesimo}{\param{inout}{a}{estr\_arreglo\_redimensionable},\param{in}{n}{nat},}{res\!: \alpha}
	res\=a[n]
\end{algorithm}

\begin{algorithm}{iextender}{\param{inout}{a}{estr\_arreglo\_redimensionable}}{}
	b \= iCrearArreglo(tam(a)+1)\\
	iCopiarArreglo(a,b,0)\\
	a \= b
\end{algorithm}

\noindent \textbf{Algoritmos auxiliares} \\

\begin{algorithm}{iCopiarArreglo}{\param{in}{a}{estr\_arreglo\_redimensionable},\param{inout}{b}{estr\_arreglo\_redimensionable},\param{in}{n}{nat},}{}
	\begin{WHILE}{n<iTam(a)}
		\begin{IF}{iDefinido?(a,n)}\\
			b[n]\= a[n]
			\end{IF}\\		
		n++
	\end{WHILE}
\end{algorithm}

\noindent \textit{\small{Las lineas 2 a 5 cuestan O(1), pero las ejecuto n veces, donde n es la cantidad de elementos del arreglo a. Entonces la complejidad es O(n)}} \\

\end{document}
